From c78f6c804ee12a3064c74717f8d20df1bf666d18 Mon Sep 17 00:00:00 2001 From: Daniel Boles Date: Sun, 26 Mar 2017 15:53:12 +0100 Subject: [PATCH] TextView: Get line direction in more efficient way We do not need to go through the heavyweight process of constructing a TextLineDisplay just to get the direction out of it, when we can simply use TextIter API to get the text and then get its direction using Pango. Adapted from a patch by Mehdi Sadeghi for GtkSourceView: https://bugzilla.gnome.org/show_bug.cgi?id=779081#c20 --- gtk/gtktextview.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/gtk/gtktextview.c b/gtk/gtktextview.c index 41db8bcc35..a8ad5c2fe0 100644 --- a/gtk/gtktextview.c +++ b/gtk/gtktextview.c @@ -6344,15 +6344,21 @@ move_cursor (GtkTextView *text_view, } static gboolean -iter_line_is_rtl (GtkTextIter *iter, GtkTextLayout *layout) +iter_line_is_rtl (GtkTextIter *iter) { - GtkTextLine *line = _gtk_text_iter_get_text_line (iter); - GtkTextLineDisplay *display = gtk_text_layout_get_line_display (layout, line, FALSE); - GtkTextDirection direction = display->direction; + GtkTextIter start, end; + char *text; + PangoDirection direction; + + start = end = *iter; + gtk_text_iter_set_line_offset (&start, 0); + gtk_text_iter_forward_line (&end); + text = gtk_text_iter_get_visible_text (&start, &end); + direction = pango_find_base_dir (text, -1); - gtk_text_layout_free_line_display (layout, display); + g_free (text); - return direction == GTK_TEXT_DIR_RTL; + return direction == PANGO_DIRECTION_RTL; } static void @@ -6455,7 +6461,7 @@ gtk_text_view_move_cursor (GtkTextView *text_view, gtk_text_buffer_get_iter_at_mark (get_buffer (text_view), &sel_bound, gtk_text_buffer_get_selection_bound (get_buffer (text_view))); - if (iter_line_is_rtl (&insert, priv->layout)) + if (iter_line_is_rtl (&insert)) move_forward = !move_forward; /* if we move forward, assume the cursor is at the end of the selection; @@ -6493,7 +6499,7 @@ gtk_text_view_move_cursor (GtkTextView *text_view, break; case GTK_MOVEMENT_WORDS: - if (iter_line_is_rtl (&newplace, priv->layout)) + if (iter_line_is_rtl (&newplace)) count *= -1; if (count < 0) -- 2.30.2